'''

整体，浮点，元组可做键
列表、字典、集合这些可变对象不可做键
键不能重复，如果重复，后面的替换前面的
字典的概念，其实是稀疏数组，每个元素是bucket(包括键对象和值对象引用)
存储步骤：
python使用hash()来计算键名对应用的散列值,
bin(hash('name')),依次取值的右边3位作为偏移量，直到为空没有值则放入值
数组长度是8，则3位3位的找，数组长度是16，则4位4位的找
'''
# create
## {}
a = {"name": "tony", "age": 42}
print(a)
## dict()函数
aa = dict(name="tonywu", age=42)
bb = dict([("name", "tonywu"), ("age", 42)])
print(aa)
print(bb)
## zip
header = ("name", "age")
value = ("tony", 42)
c1 = dict(zip(header, value))
print(c1)

## dict.fromkeys创建空值
print(dict.fromkeys(header))


## .items(),.keys(),.values()

## 修改更新或合并到原对象
a = {"name": "tony", "age": 42}
aaa = {"name": "tonywu", "age": 42}
a.update(aaa)
print(a)

## 合并生成新对象
print(a|b)
## 删除
a.pop("name") #删除且返回一个值
print(a)
del a['age']
print(a)
deleted = aaa.popitem() #随机删除键值对
print(aaa, deleted)
aaa.clear()
print(aaa)



'''
1. 字典内存消耗大，是典型的空间换时间
2. 键查询速度快
3. 往字典中加新元素会导致扩容，导致列表中键的次序变化，因此在要在遍历字典的同时进行字典的修改（也就是不要读的同时写操作）
4. 键必须可散列化
'''